昨天看完value types,今天來聊聊 reference types。
solidity 的 reference types 有三個東西很特別我們需要先特別來認識一下
memory
預設 fuction 傳入跟 return 它們都是預設放在 memory
storage
預設的區域變數跟全域變數都是放在 storage
calldata
效果跟 memory 很接近,但是只有 read only。大部分是應用在參數傳入使用
用下面例子兩個程式例子
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract hellotest
{
//這種就叫做 storage
int[] public numbers;
function Numbers() public
{
numbers.push(1);
numbers.push(2);
// 其實不用特意指定,它也是會storage
int[] storage myArray = numbers;
// 實質上會影響到 number
myArray[0] = 0;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract hellotest
{
int[] public numbers;
function Numbers() public
{
numbers.push(1);
numbers.push(2);
//這種就是儲存在memory
int[] memory myArray = numbers;
//這個異動到的值其實沒有,影響到原本的number
myArray[0] = 0;
}
}
上面介紹完,有別於一般於三種儲存狀態,再來介紹一些比較常見的 references-type
很常見的宣告,基本上就常見的型別 T[N] 這種宣告方式就可以,下面有一些簡單的範例
uint balance[10];
uint balance[3] = [1,2,3];
balance[2]=5;
uint size = 3;
uint balance[] = new uint[](size);
這個如果善於寫 golang,應該都很熟悉,下面也來點簡單的介紹
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract test {
struct Member {
string name;
string addr;
}
Member member;
function setMember() public {
member = Member('syhlion', 'Taiwan');
}
function getAddress() public view returns (string memory) {
return member.addr;
}
}
明天會來介紹 mapping types。